home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 January / PCWorld_2007-01_cd.bin / v cisle / autoit / autoit-v3.2.0.1-setup.exe / Include / Inet.au3 < prev    next >
Text File  |  2006-07-14  |  13KB  |  343 lines

  1. ; Include Version:1.65 (6 July 2006)
  2. #include-once
  3. ; ------------------------------------------------------------------------------
  4. ;
  5. ; AutoIt Version: 3.0
  6. ; Language:       English
  7. ; Description:    Functions that assist with Internet.
  8. ;
  9. ; ------------------------------------------------------------------------------
  10. ;===============================================================================
  11. ;
  12. ; Function Name:    _GetIP()
  13. ; Description:      Get public IP address of a network/computer.
  14. ; Parameter(s):     None
  15. ; Requirement(s):   Internet access.
  16. ; Return Value(s):  On Success - Returns the public IP Address
  17. ;                   On Failure - -1  and sets @ERROR = 1
  18. ; Author(s):        Larry/Ezzetabi & Jarvis Stubblefield
  19. ;
  20. ;===============================================================================
  21. Func _GetIP()
  22.     Local $ip, $t_ip
  23.     If InetGet("http://checkip.dyndns.org/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
  24.         $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
  25.         FileDelete(@TempDir & "\~ip.tmp")
  26.         $ip = StringTrimLeft($ip, StringInStr($ip, ":") + 1)
  27.         $ip = StringTrimRight($ip, StringLen($ip) - StringInStr($ip, "/") + 2)
  28.         $t_ip = StringSplit($ip, '.')
  29.         If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
  30.             Return $ip
  31.         EndIf
  32.     EndIf
  33.     If InetGet("http://www.whatismyip.com/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
  34.         $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
  35.         FileDelete(@TempDir & "\~ip.tmp")
  36.         $ip = StringTrimLeft($ip, StringInStr($ip, "Your ip is") + 10)
  37.         $ip = StringLeft($ip, StringInStr($ip, " ") - 1)
  38.         $ip = StringStripWS($ip, 8)
  39.         $t_ip = StringSplit($ip, '.')
  40.         If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
  41.             Return $ip
  42.         EndIf
  43.     EndIf
  44.     SetError(1)
  45.     Return -1
  46. EndFunc   ;==>_GetIP
  47.  
  48. ;===============================================================================
  49. ;
  50. ; Function Name:    _INetExplorerCapable()
  51. ; Description:      Convert a string to IE capable line
  52. ; Parameter(s):     $s_IEString - String to convert to a capable IExplorer line
  53. ; Requirement(s):   None
  54. ; Return Value(s):  On Success - Returns the converted string
  55. ;                   On Failure - Blank String and @error = 1
  56. ; Author(s):        Wes Wolfe-Wolvereness <Weswolf at aol dot com>
  57. ;
  58. ;===============================================================================
  59. ;
  60. Func _INetExplorerCapable($s_IEString)
  61.     If StringLen($s_IEString) <= 0 Then
  62.         Return ''
  63.         SetError(1)
  64.     Else
  65.         Local $s_IEReturn
  66.         Local $i_IECount
  67.         Local $n_IEChar
  68.         For $i_IECount = 1 To StringLen($s_IEString)
  69.             $n_IEChar = '0x' & Hex(Asc(StringMid($s_IEString, $i_IECount, 1)), 2)
  70.             If $n_IEChar < 0x21 Or $n_IEChar = 0x25 Or $n_IEChar = 0x2f Or $n_IEChar > 0x7f Then
  71.                 $s_IEReturn = $s_IEReturn & '%' & StringRight($n_IEChar, 2)
  72.             Else
  73.                 $s_IEReturn = $s_IEReturn & Chr($n_IEChar)
  74.             EndIf
  75.         Next
  76.         Return $s_IEReturn
  77.     EndIf
  78. EndFunc   ;==>_INetExplorerCapable
  79.  
  80. ;===============================================================================
  81. ;
  82. ; Function Name:    _INetGetSource()
  83. ; Description:      Gets the source from an URL without writing a temp file.
  84. ; Parameter(s):     $s_URL = The URL of the site.
  85. ; Requirement(s):   DllCall/Struct & WinInet.dll
  86. ; Return Value(s):  On Success - Returns the source code.
  87. ;                   On Failure - 0  and sets @ERROR = 1
  88. ; Author(s):        Wouter van Kesteren.
  89. ;
  90. ;===============================================================================
  91. Func _INetGetSource($s_URL, $s_Header = '')
  92.     
  93.     If StringLeft($s_URL, 7) <> 'http://' And StringLeft($s_URL, 8) <> 'https://' Then $s_URL = 'http://' & $s_URL
  94.     
  95.     Local $h_DLL = DllOpen("wininet.dll")
  96.     
  97.     Local $ai_IRF, $s_Buf = ''
  98.     
  99.     Local $ai_IO = DllCall($h_DLL, 'int', 'InternetOpen', 'str', "AutoIt v3", 'int', 0, 'int', 0, 'int', 0, 'int', 0)
  100.     If @error Or $ai_IO[0] = 0 Then
  101.         DllClose($h_DLL)
  102.         SetError(1)
  103.         Return ""
  104.     EndIf
  105.     
  106.     Local $ai_IOU = DllCall($h_DLL, 'int', 'InternetOpenUrl', 'int', $ai_IO[0], 'str', $s_URL, 'str', $s_Header, 'int', StringLen($s_Header), 'int', 0x80000000, 'int', 0)
  107.     If @error Or $ai_IOU[0] = 0 Then
  108.         DllCall($h_DLL, 'int', 'InternetCloseHandle', 'int', $ai_IO[0])
  109.         DllClose($h_DLL)
  110.         SetError(1)
  111.         Return ""
  112.     EndIf
  113.     
  114.     Local $v_Struct = DllStructCreate('udword')
  115.     DllStructSetData($v_Struct, 1, 1)
  116.     
  117.     While DllStructGetData($v_Struct, 1) <> 0
  118.         $ai_IRF = DllCall($h_DLL, 'int', 'InternetReadFile', 'int', $ai_IOU[0], 'str', '', 'int', 256, 'ptr', DllStructGetPtr($v_Struct))        
  119.         $s_Buf &= StringLeft($ai_IRF[2], DllStructGetData($v_Struct, 1))
  120.     WEnd
  121.     
  122.     DllCall($h_DLL, 'int', 'InternetCloseHandle', 'int', $ai_IOU[0])
  123.     DllCall($h_DLL, 'int', 'InternetCloseHandle', 'int', $ai_IO[0])
  124.     DllClose($h_DLL)
  125.     Return $s_Buf
  126. EndFunc   ;==>_INetGetSource
  127.  
  128. ;===============================================================================
  129. ;
  130. ; Function Name:    _INetMail()
  131. ; Description:      Open default mail client with given Address/Subject/Body
  132. ; Parameter(s):     $s_MailTo    - Address for E-Mail
  133. ;                   $s_Subject   - Subject <Weswolf at aol dot com>of E-Mail
  134. ;                   $s_MailBody  - Body of E-Mail
  135. ; Requirement(s):   _INetExplorerCapable
  136. ; Return Value(s):  On Success - Process ID of e-mail client
  137. ;                   On Failure - If Opt('RunErrorsFatal', 1)
  138. ;                                   -> Crash
  139. ;                                Else Opt('RunErrorsFatal', 0)
  140. ;                                   -> Blank String and @error = 1
  141. ; Author(s):        Wes Wolfe-Wolvereness <Weswolf at aol dot com>
  142. ;
  143. ;===============================================================================
  144. ;
  145. Func _INetMail($s_MailTo, $s_MailSubject, $s_MailBody)
  146.     Local $prev = opt("ExpandEnvStrings", 1)
  147.     Local $var = RegRead('HKCR\mailto\shell\open\command', "")
  148.     Local $ret = Run(StringReplace($var, '%1', _INetExplorerCapable('mailto:' & $s_MailTo & '?subject=' & $s_MailSubject & '&body=' & $s_MailBody)))
  149.     opt("ExpandEnvStrings", $prev)
  150.     Return $ret
  151. EndFunc   ;==>_INetMail
  152.  
  153. ;===============================================================================
  154. ;
  155. ; Function Name:    _INetSmtpMail()
  156. ; Description:      Sends an email using SMTP over TCP IP.
  157. ; Parameter(s):     $s_SmtpServer    - SMTP server to be used for sending email
  158. ;                   $s_FromName        - Name of sender
  159. ;                   $s_FromAddress    - eMail address of sender
  160. ;                   $s_ToAddress    - Address that email is to be sent to
  161. ;                   $s_Subject        - Subject of eMail
  162. ;                    $as_Body        - Single dimension array containing the body of eMail as strings
  163. ;                    $s_helo            - Helo identifier (default @COMPUTERNAME) sometime needed by smtp server
  164. ;                    $s_first        - send before Helo identifier (default @CRLF) sometime needed by smtp server
  165. ;                    $b_trace        - trace on a splash window (default 0 = no trace)
  166. ; Requirement(s):   None
  167. ; Return Value(s):  On Success - Returns 1
  168. ;                   On Failure - 0  and sets
  169. ;                                            @ERROR = 1        -    Invalid Parameters
  170. ;                                            @ERROR = 2        -    Unable to start TCP
  171. ;                                            @ERROR = 3        -    Unable to resolve IP
  172. ;                                            @ERROR = 4        -    Unable to create socket
  173. ;                                            @ERROR = 5x        -    Cannot open SMTP session
  174. ;                                            @ERROR = 50x    -    Cannot send body
  175. ;                                            @ERROR = 5000    -    Cannot close SMTP session
  176. ; Authors:        Original function to send email via TCP     - Asimzameer
  177. ;                    Conversion to UDF                        - Walkabout
  178. ;                    Correction    Helo, timeout, trace        - Jpm
  179. ;                    Correction send before Helo                - Jpm
  180. ;
  181. ;===============================================================================
  182. Func _INetSmtpMail($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_helo = "", $s_first=" ", $b_trace = 0)
  183.     
  184.     Local $v_Socket
  185.     Local $s_IPAddress
  186.     Local $i_Count
  187.     Local $s_Send[6]
  188.     Local $s_ReplyCode[6];Return code from SMTP server indicating success
  189.     
  190.     If $s_SmtpServer = "" Or $s_FromAddress = "" Or $s_ToAddress = "" Or $s_FromName = "" Or StringLen($s_FromName) > 256 Then
  191.         SetError(1)
  192.         Return 0
  193.     EndIf
  194.     If $s_helo = "" Then $s_helo = @ComputerName
  195.     If TCPStartup() = 0 Then
  196.         SetError(2)
  197.         Return 0
  198.     EndIf
  199.     StringRegExp($s_SmtpServer, "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")
  200.     If @extended Then
  201.         $s_IPAddress = $s_SmtpServer
  202.     Else
  203.         $s_IPAddress = TCPNameToIP($s_SmtpServer)
  204.     EndIf
  205.     If $s_IPAddress = "" Then
  206.         TCPShutdown()
  207.         SetError(3)
  208.         Return 0
  209.     EndIf
  210.     $v_Socket = TCPConnect($s_IPAddress, 25)
  211.     If $v_Socket = -1 Then
  212.         TCPShutdown()
  213.         SetError(4)
  214.         Return (0)
  215.     EndIf
  216.     
  217.     $s_Send[0] = "HELO " & $s_helo & @CRLF
  218.     If StringLeft($s_helo,5) = "EHLO " Then $s_Send[0] = $s_helo & @CRLF
  219.     $s_ReplyCode[0] = "250"
  220.         
  221.     $s_Send[1] = "MAIL FROM: <" & $s_FromAddress & ">" & @CRLF
  222.     $s_ReplyCode[1] = "250"
  223.     $s_Send[2] = "RCPT TO: <" & $s_ToAddress & ">" & @CRLF
  224.     $s_ReplyCode[2] = "250"
  225.     $s_Send[3] = "DATA" & @CRLF
  226.     $s_ReplyCode[3] = "354"
  227.     
  228.     $s_Send[4] =     "From:" & $s_FromName & "<" & $s_FromAddress & ">" & @CRLF & _
  229.             "To:" & "<" & $s_ToAddress & ">" & @CRLF & _
  230.             "Subject:" & $s_Subject & @CRLF & _
  231.             "Mime-Version: 1.0" & @CRLF & _
  232.             "Content-Type: text/plain; charset=US-ASCII" & @CRLF & _
  233.             @CRLF
  234.     $s_ReplyCode[4] = ""
  235.     
  236.     $s_Send[5] = @CRLF & "." & @CRLF
  237.     $s_ReplyCode[5] = "250"
  238.     
  239.     ; open stmp session
  240.     If _SmtpSend($v_Socket, $s_Send[0], $s_ReplyCode[0], $b_trace, "220", $s_first) Then
  241.         SetError(50)
  242.         Return 0
  243.     EndIf
  244.     ; send header
  245.     For $i_Count = 1 To UBound($s_Send) - 2
  246.         If _SmtpSend($v_Socket, $s_Send[$i_Count], $s_ReplyCode[$i_Count], $b_trace) Then
  247.             SetError(50 + $i_Count)
  248.             Return 0
  249.         EndIf
  250.     Next
  251.     
  252.     ; send body records (a record can be multiline : take care of a subline beginning with a dot should be ..)
  253.     For $i_Count = 0 To UBound($as_Body) - 1
  254.         ; correct line beginning with a dot
  255.         If StringLeft($as_Body[$i_Count], 1) = "." Then $as_Body[$i_Count] = "." & $as_Body[$i_Count]
  256.         
  257.         If _SmtpSend($v_Socket, $as_Body[$i_Count] & @CRLF, "", $b_trace) Then
  258.             SetError(500 + $i_Count)
  259.             Return 0
  260.         EndIf
  261.     Next
  262.     
  263.     ; close the smtp session
  264.     $i_Count = UBound($s_Send) - 1
  265.     If _SmtpSend($v_Socket, $s_Send[$i_Count], $s_ReplyCode[$i_Count], $b_trace) Then
  266.         SetError(5000)
  267.         Return 0
  268.     EndIf
  269.     
  270.     TCPCloseSocket($v_Socket)
  271.     TCPShutdown()
  272.     Return 1
  273. EndFunc   ;==>_INetSmtpMail
  274.  
  275. ; internals routines----------------------------------
  276. Func _SmtpTrace($str, $timeout = 0)
  277.     Local $W_TITLE = "SMTP trace"
  278.     Local $g_smtptrace = ControlGetText($W_TITLE, "", "Static1")
  279.     $str = StringLeft(StringReplace($str, @CRLF, ""), 70)
  280.     $g_smtptrace &= @HOUR & ":" & @MIN & ":" & @SEC & " " & $str & @LF
  281.     If WinExists($W_TITLE) Then
  282.         ControlSetText($W_TITLE, "", "Static1", $g_smtptrace)
  283.     Else
  284.         SplashTextOn($W_TITLE, $g_smtptrace, 400, 500, 500, 100, 4 + 16, "", 8)
  285.     EndIf
  286.     If $timeout Then Sleep($timeout * 1000)
  287. EndFunc   ;==>_SmtpTrace
  288.  
  289. Func _SmtpSend($v_Socket, $s_Send, $s_ReplyCode, $b_trace, $s_IntReply="", $s_first="")
  290.     Local $s_Receive, $i, $timer
  291.     If $b_trace Then _SmtpTrace($s_Send)
  292.         
  293.     If $s_IntReply <> ""  Then
  294.  
  295.         ; Send special first char to awake smtp server
  296.         If $s_first <> -1 Then
  297.             If TCPSend($v_Socket, $s_first) = 0 Then
  298.                 TCPCloseSocket($v_Socket)
  299.                 TCPShutdown()
  300.                 Return 1; cannot send
  301.             EndIf
  302.         EndIf
  303.         
  304.         ; Check intermediate reply before HELO acceptation
  305.         $s_Receive = ""
  306.         $timer = TimerInit()
  307.         While StringLeft($s_Receive,StringLen($s_IntReply)) <> $s_IntReply And TimerDiff($timer) < 45000
  308.             $s_Receive = TCPRecv($v_Socket, 1000)
  309.             If $b_trace And $s_Receive <> "" Then _SmtpTrace("intermediate->" & $s_Receive)
  310.         WEnd
  311.     EndIf
  312.     
  313.     ; Send string.
  314.     If TCPSend($v_Socket, $s_Send) = 0 Then
  315.         TCPCloseSocket($v_Socket)
  316.         TCPShutdown()
  317.         Return 1; cannot send
  318.     EndIf
  319.  
  320.     $timer = TimerInit()
  321.     
  322.     $s_Receive = ""
  323.     While $s_Receive = "" And TimerDiff($timer) < 45000
  324.         $i += 1
  325.         $s_Receive = TCPRecv($v_Socket, 1000)
  326.         If $s_ReplyCode = "" Then ExitLoop
  327.     WEnd
  328.     
  329.     If $s_ReplyCode <> "" Then
  330.         ; Check replycode
  331.         If $b_trace Then _SmtpTrace($i & " <- " & $s_Receive)
  332.         
  333.         If StringLeft($s_Receive, StringLen($s_ReplyCode)) <> $s_ReplyCode Then
  334.             TCPCloseSocket($v_Socket)
  335.             TCPShutdown()
  336.             If $b_trace Then _SmtpTrace("<-> " & $s_ReplyCode, 5)
  337.             Return 2; bad receive code
  338.         EndIf
  339.     EndIf
  340.     
  341.     Return 0
  342. EndFunc   ;==>_SmtpSend
  343.